package cn.hallele.bbts.core.component.io;

import cn.hallele.bbts.core.common.constants.MsgCodeConst;
import cn.hallele.bbts.core.common.utils.HttpUtil;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.*;

import java.io.Serial;
import java.io.Serializable;

/**
 * BBTSResponse
 *
 * @param <T> 泛型
 * @author anle5
 * @since 1.0-SNAPSHOT 2022/12/6 21:56 周二
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BBTSResponse<T> implements Serializable {
    @Serial
    private static final long serialVersionUID = -5090326667859974352L;

    /**
     * 响应头
     */
    @Valid
    @NotNull
    private BBTSHeader header;

    /**
     * 响应体
     */
    private T body;

    /**
     * 成功响应
     *
     * @param responseBody 响应体
     * @param <T>          响应体类型泛型
     * @return T
     */
    public static <T> BBTSResponse<T> ok(T responseBody) {
        return BBTSResponse.<T>builder()
                .header(buildHeader(MsgCodeConst.SUCCESS))
                .body(responseBody)
                .build();
    }

    /**
     * 失败响应
     *
     * @param msgCode      响应码
     * @param responseBody 响应体
     * @param <T>          响应体类型泛型
     * @return T
     */
    public static <T> BBTSResponse<T> failed(String msgCode, T responseBody) {
        return BBTSResponse.<T>builder()
                .header(buildHeader(msgCode))
                .body(responseBody)
                .build();
    }

    /**
     * 失败响应
     *
     * @param msgCode 响应码
     * @param <T>     响应体类型泛型
     * @return T
     */
    public static <T> BBTSResponse<T> failed(String msgCode) {
        return BBTSResponse.<T>builder()
                .header(buildHeader(msgCode))
                .body(null)
                .build();
    }

    /**
     * buildHeader
     *
     * @param msgCode msgCode
     * @return BBTSHeader
     */
    private static BBTSHeader buildHeader(String msgCode) {
        return BBTSHeader.builder()
                .success(MsgCodeConst.SUCCESS.equals(msgCode))
                .msgCode(msgCode)
                .accessDevice(HttpUtil.getClientPlatformName())
                .ip(HttpUtil.getClientIp())
                .build();
    }
}
